// 版权归Go作者所有。版权所有。
// 此源代码的使用受BSD样式的约束
// 可以在许可证文件中找到的许可证。

package modinfo

import "time"

// 请注意，这些结构是公开可见的（go list API的一部分）
// 这些字段记录在../list/list.go的帮助文本中

type ModulePublic struct {
	Path       string        `json:",omitempty"` // 模块路径
	Version    string        `json:",omitempty"` // 模块版本
	Versions   []string      `json:",omitempty"` // 可用模块版本
	Replace    *ModulePublic `json:",omitempty"` // 替换为此模块
	Time       *time.Time    `json:",omitempty"` // 创建版本的时间
	Update     *ModulePublic `json:",omitempty"` // 可用更新（带-u）
	Main       bool          `json:",omitempty"` // 这是主模块吗？
	Indirect   bool          `json:",omitempty"` // 主模块仅间接需要模块
	Dir        string        `json:",omitempty"` // 保存文件本地副本（如果有）的目录
	GoMod      string        `json:",omitempty"` // 描述模块的go.mod文件路径（如有）
	GoVersion  string        `json:",omitempty"` // 模块中使用的go版本
	Retracted  []string      `json:",omitempty"` // 收回信息，如有（带-retracted或-u）
	Deprecated string        `json:",omitempty"` // 弃用消息（如果有）（带-u）
	Error      *ModuleError  `json:",omitempty"` // 加载模块时出错
}

type ModuleError struct {
	Err string // 错误文本
}

func (m *ModulePublic) String() string {
	s := m.Path
	versionString := func(mm *ModulePublic) string {
		v := mm.Version
		if len(mm.Retracted) == 0 {
			return v
		}
		return v + " (retracted)"
	}

	if m.Version != "" {
		s += " " + versionString(m)
		if m.Update != nil {
			s += " [" + versionString(m.Update) + "]"
		}
	}
	if m.Deprecated != "" {
		s += " (deprecated)"
	}
	if m.Replace != nil {
		s += " => " + m.Replace.Path
		if m.Replace.Version != "" {
			s += " " + versionString(m.Replace)
			if m.Replace.Update != nil {
				s += " [" + versionString(m.Replace.Update) + "]"
			}
		}
		if m.Replace.Deprecated != "" {
			s += " (deprecated)"
		}
	}
	return s
}
